#include <stdlib.h>
#include "vector_dinamico.h"

struct vector{
    size_t tam;
    int cant_elem;
    void** datos;
};

/* ******************************************************************
 *                        IMPLEMENTACION
 * *****************************************************************/


vector_t* vector_crear(size_t tam){
	
    vector_t* vector = malloc(sizeof(vector_t));
    if (vector == NULL) return NULL;

    vector->datos = malloc(tam * sizeof(void*));
    if (vector->datos == NULL)    {
        free(vector);
        return NULL;
    }
	vector->cant_elem = 0;
    vector->tam = tam;
    return vector;
}


void vector_destruir(vector_t *vector,void destruir_dato (void*)){
	
	/* Libero los datos del vector */
	if (destruir_dato)
		for (int i=0 ; i<vector->tam ; i++)
			if (vector->datos[i])
				destruir_dato (vector->datos[i]);

	
	/* Libero el vector */
	free (vector->datos);
	
	/* Libero la estructura vectro */
	free (vector);

}

void vector_destruir_con_elementos(vector_t* vector, void destruir_dato(void*),size_t cant){

	/* Libero los datos del vector */
		if (destruir_dato && cant != 0)
			for (int i=0 ; i<cant ; i++)
				if (vector->datos[i])
					destruir_dato (vector->datos[i]);


		/* Libero el vector */
		free (vector->datos);

		/* Libero la estructura vectro */
		free (vector);

}

bool vector_redimensionar(vector_t *vector, size_t tam_nuevo)
{
    void** datos_nuevo = realloc(vector->datos, tam_nuevo * sizeof(void*));
    // Cuando tam_nuevo es 0, es correcto que devuelva NULL
    // En toda otra situaci�n significa que fall� el realloc
    if (tam_nuevo > 0 && datos_nuevo == NULL)
    {
        return false;
    }
    vector->datos = datos_nuevo;
    vector->tam = tam_nuevo;
    return true;
}


void* vector_obtener (vector_t *vector, size_t pos){

	if (pos > vector_obtener_tamanio(vector))
		return NULL;
	
	return vector->datos[pos];
	
}


bool vector_guardar(vector_t *vector, size_t pos, void* valor)
{
	if (pos < vector_obtener_tamanio(vector)){
		vector->cant_elem++; 
		vector->datos[pos] = valor;
		return true;
	} else return false;
}


size_t vector_obtener_tamanio(vector_t *vector)
{
	return vector->tam;
}


